-- dbtable用于存储数据 key=为redisKey value=为stocK
-- addtable用于存储本次出入库的key及对应的数量
-- keyList 用于存储本次的所有key
-- 切割函数 str为需要切割的字符串 symbol为切割符号,mytable为需要存放的表
-- 注意: 例如 str = 1/2 symbol=/时 切割只能拿到1 也就是说这饿方法只能拿到特殊符号前的字符 所以拼接时要注意特殊符号的拼接
local array = {}
local function split(str,symbol)
local i = 1;
    for item in string.gmatch( str,"(.-)"..symbol) do
        array[i] = item
        i = i+1;
    end
end

--需要添加到redis中的数据(即数据库中的库存数量) 所有属于都在次list中 key + "/" + addNum + "/" + dbNUm + "/"
local needAddMapTab = ARGV
--本次所有key数据
local updateTable = {}
local templateTable = {}
local n = 0
for i, iv in ipairs(needAddMapTab) do
       split(iv,"ø/ø")
       -- array[1]为key 2为新加数量 3 为数据库数量
       n = n+1
       --本次添加的数量
       local dd = array[2]
       --数据库数量
       local ff = array[3]
        templateTable[n] = array[1]
    KEYS[2] = "{"..KEYS[1].."}"..array[1]
       --判断key是否在redis中
        local productLocks =  redis.call('get', KEYS[2])
        --如果key在redis中不存在直接用数据库传下来的
        if tonumber(productLocks) == nil
          then
           if  ff ~= nil and tonumber(dd) ~=nil and (ff - tonumber(dd)) >= 0
              then
              updateTable[KEYS[2]] = (ff - dd)
           else
                return false
           end
        else
        -- 如果key在redis中存在则直接用redis中的数据
        if  tonumber(productLocks) ~= nil and dd ~=nil and (tonumber(productLocks) - dd) >= 0
             then
             updateTable[KEYS[2]] = (productLocks - dd)
           else
                return false
           end
        end
    end
-- 全部符合标准后循环更新

for j, jv in ipairs(templateTable) do
    KEYS[3] = "{"..KEYS[1].."}"..jv
    local val = updateTable[KEYS[3]]
    redis.call("set", KEYS[3], val)
    redis.call("EXPIRE", KEYS[3], 600)
   end
return true